分享人:甘乐
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
基于分布式架构的系统是一组相互独立但并行协同工作的计算机集合; 对系统的用户来说,系统就象一台计算机一样”这两层意思.从硬件角度,每台机器都是自治的、独立的;从软件角度,用户感受是整体的、一致的.
分布式架构设计的核心理念是“并行拆分与横向扩展”,即按照一定维度将系统进行拆分,系统各部分松耦合并行运行,并建立起较为完善的横向扩展与容错恢复机制.
1. SOA定义
Service-architecture.com将SOA定义为:“本质上是服务的集合.服务间彼此通信,这种通信可能是简单的数据传送,也可能是两个或更多的服务协调进行某些活动.服务间需要某些方法进行连接.所谓服务就是精确定义、封装完善、独立于其他服务所处环境和状态的函数.”
满足以下全部3个基本要素的应用被称为SOA的编程:
2.SOA核心理念
在SOA架构风格中,服务是最核心的抽象手段,业务被划分(组件化)为一系列粗粒度的业务服务和业务流程.业务服务相对独立、自包含、 可重用,由一个或者多个分布的系统所实现,而业务流程由服务组装而来.一个"服务"定义了一个与业务功能或业务数据相关的接口,以及约束这个接口的服务契约. 接口和契约采用中立、基于标准的方式进行定义,它独立于实现服务的硬件平台、操作系统和编程语言.
2.SOA核心理念
这使得构建在不同系统中的服务可以以一种统一的和通用的方式进行交互、相互理解.除了这种不依赖于特定技术的中立特性,通过服务注册库 (Service Registry)加上企业服务总线(Enterprise Service Bus)来支持动态查询、定位、路由和中介(Mediation)的能力,使得服务之间的交互是动态的,位置是透明 的.技术和位置的透明性,使得服务的请求者和提供者之间高度解耦.
3.SCA概述
SCA (Service Component Architecture)是为实现 SOA 而产生的一种规范.它提供了一种编程模型,能够十分方便、快速地来构建 SOA 所需的系统和应用.SCA 提出了一种组合应用(composite applications)的概念,这些组合可以是各种符合 SOA 规范的服务, 或者是已经构建好的其他组合应用.通过这种灵活的编程方式,它可以很快地组装出各种所需的应用程序.
SCA基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的服务组装起来的解决方案来满足特定业务需求.这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用的业务逻辑,这些业务逻辑作为组合构件的一部分被复用.
4.SCA装配模型
SCA的基础工件就是component,它是SCA的构成单元.构件(component)由一个实现的可配置(implementation)实例所组成.在该构件中,实现是提供业务功能的程序代码片段.该业务功能作为服务(service)而提供,为其他构件所使用.实现也许依赖于由其他构件所 提供的服务,这些依赖被称作”引用”(reference).实现可以有一个可设置的属性(properties),该属性是可以影响业务功能操作的数据值.构件通过提供属性值和连线(wire)到由其他构件提供服务的引用来配置实现.
4.SCA装配模型
SCA把在装配应用中的内容和联接称为组合构件(composite).组合构件能包含构件,服务,引用,属性声明以及描述这些元素间连接的连线(wire).组合构件可以分组并连接以不同技术实现的构件,其允许为每个业务任务使用相应的技术.反过来,组合构件能作为完整 的构件实现来使用:提供服务,依赖引用以及可设置的属性值.
SOA vs 微服务
Java类如何提供SCA构件的实现
5.1服务
基于Java类的构件实现可以提供一个或多个服务.
基于Java的实现所提供的服务,可以有一个按下列方法之一定义的接口:
Java实现类必须实现服务接口定义的所有操作.如果服务接口是用一个Java接口定义的,那么基于Java的构件要么实现此Java接口,要么实现接口的所有操作.
由Java类定义接口的服务(与Java接口相对)不是远程的.产生自WSDL portType的Java接口是远程的
5.2引用
引用可以通过注入或ComponentContext API获得.推荐尽可能使用注入方式来访问引用.
1) 引用注入, 通过使用@Reference注解,Java实现类型可以显式地指定其使用的引用.
2) 动态引用访问, 引用可以通过ComponentContext.getService()和ComponentContext.getServiceReference(..)方法来动态访问.
5.3属性
1) 属性注入, 属性可以通过注入或ComponentContext API来获得.Java实现类型可以通过使用@Property注解显式地指定其属性;
2) 动态属性访问,属性可以通过ComponentContext. getProperty ()方法来动态访问.
5.4实现实例的实例化
Java实现类必须提供一个public或protected的构造函数,SCA运行时用此构造函数实例化实现的实例.构造函数可以有参数, 当存在参数时,SCA容器会在调用构造函数时传递可用的属性或引用值.未通过构造函数设置的任何属性或引用值,都将会在任一服务方法被调用之前, 被设置给属性域或被传递给与其关联的setter方法.
5.5实现作用域与生命周期回调
Java实现类型支持《SCA Java通用注解和API规范中》定义的所有作用域:STATELESS, REQUEST, CONVERSATION和COMPOSITE. 实现通过使用@Scope注解指定它们的作用域. 当实现类未指定@Scope注解,则其作用域默认为STATELESS.
Java构件实现通过使用@Init和@Destroy注解分别指定init和destroy回调.
5.6指定构件类型(component type)
对于Java实现类,构件类型一般都是直接由Java类内省而来.
在配置文件中对构件类型的指定是可选的.component type配置文件由加载Java类的同一个类加载器发现.配置文件必须在与实现的命名空间一致的目录下,并与Java类名相同,且以.componentType扩展名替代.class扩展名.
SCA 与 Spring Framework整合
与 Spring bean 类似,SCA 组件可以包含到其他组件所提供的服务的引用,并且有一些属性可供配置.与 Spring 形成对比的是,SCA 是一种跨语言的分布式组件架构, 它支持多种组件通信机制.通过将 Spring beans 发布为可由其他组件访问的服务并为 Spring beans 提供关联到其他(可能为远程)组件的服务的引用,SCA 可以扩展 Spring 组件的功能.
要将 SCA 与 Spring 相结合,一种有效的方法是使用 Spring 来构建 “粗粒度” 的服务组件实现,并引入到 SCA 中以便公开服务、关联服务组件以及处理异构和分布式系统.
易于测试组件是 Spring 的一项优异的特性.缺少 API 和注入技术导致您只能使用简单的模拟对象进行测试.SCA 在服务方面对此进行了补充,因为关于服务组件的 SCA 复合 集可以方便地切换到模拟配置以进行测试.
2.IBM developerworks技术专栏《SCA 专题》
3.《SOA:原理•方法•实践,第 1 部分: SOA 的基本概念》